package main

import (
	"context"
	"fmt"
	"io/ioutil"
	"net/http"
	"net/http/cookiejar"
	"sync"
	"time"
)

// 访问单个网址的函数
func fetchURL(url string, wg *sync.WaitGroup, numTimes int) {
	defer wg.Done()
	for i := 0; i < numTimes; i++ {
		// 创建一个带有超时的上下文
		ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
		defer cancel()

		// 创建一个 HTTP 客户端，设置超时
		client := &http.Client{
			Timeout: 10 * time.Second,
		}
		// 创建一个 cookie jar
		jar, _ := cookiejar.New(nil)
		client.Jar = jar

		req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
		if err != nil {
			fmt.Printf("第 %d 次创建请求 %s 时出错: %v\n", i+1, url, err)
			continue
		}

		// 设置请求头
		req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")

		resp, err := client.Do(req)
		if err != nil {
			fmt.Printf("第 %d 次访问 %s 时出错: %v\n", i+1, url, err)
			continue
		}
		defer resp.Body.Close()

		// 读取响应内容（这里只是简单读取，可根据需求处理）
		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			fmt.Printf("第 %d 次读取 %s 响应内容时出错: %v\n", i+1, url, err)
			continue
		}

		fmt.Printf("第 %d 次访问 %s 成功，状态码: %d，响应内容长度: %d\n", i+1, url, resp.StatusCode, len(body))
	}
}

func main() {
	// 要访问的网址列表
	urls := []string{
		"http://172.1.4.155:8080/view",
	}
	// 每个网址的访问次数
	numTimes := 10

	var wg sync.WaitGroup
	// 为每个网址启动一个协程进行多次访问
	for _, url := range urls {
		wg.Add(1)
		go fetchURL(url, &wg, numTimes)
	}

	// 等待所有协程完成
	wg.Wait()
	fmt.Println("所有网址多次访问完成")
}
